home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / tcclib.exe / lha / HORZMENU.C < prev    next >
Text File  |  1990-02-08  |  2KB  |  67 lines

  1. #include "tcclib.h"
  2. #include <ctype.h>
  3. #include <conio.h>
  4. #include <string.h>
  5.  
  6. void HorzMenu( MenuRec *MenuPtr, int NumChoices, int x, int y, int xx, int yy )
  7. {
  8.     register int pos=0, i;
  9.     register MenuRec *MP = MenuPtr;
  10.     int start[20], len[20], tlen=0, longest=0;
  11.     int ch;
  12.  
  13.     gotoxy( x, y );
  14.     for (i=0; i<NumChoices; ++i) {
  15.         start[i] = wherex();
  16.         len[i] = strlen( MP->Item );
  17.         SayF( "%s  ", MP->Item );
  18.         tlen += len[i] + 2;
  19.         if ( strlen( MP->Desc ) > longest ) longest = strlen( MP->Desc );
  20.         MP++;
  21.     }
  22.  
  23.     for ( ;; ) {
  24.         ChangeBlock( x, y, tlen, y, A_NORMAL );
  25.         BlockErase( xx, yy, xx+longest-1, yy );
  26.         ChangeBlock( start[pos], y, start[pos] + len[pos] - 1, y, A_REVERSE );
  27.         AtSay( xx, yy, MenuPtr[pos].Desc );
  28.         HideCursor();
  29.         switch( ch = GComm() ) {
  30.             case RIGHT:
  31.                 pos++;
  32.                 if ( pos >= NumChoices )
  33.                     pos = 0;
  34.                 break;
  35.             case LEFT:
  36.                 pos--;
  37.                 if ( pos < 0 )
  38.                     pos = NumChoices - 1;
  39.                 break;
  40.             case CR:
  41.                 ChangeBlock( x, y, tlen, y, A_NORMAL );
  42.                 BlockErase( xx, yy, xx+longest-1, yy );
  43.                 MenuPtr[pos].func();
  44.                 break;
  45.             case ESC:
  46.                 BlockErase( x, y, tlen, y );
  47.                 BlockErase( xx, yy, xx+longest-1, yy );
  48.                 return;
  49.             default:
  50.                 for (i=pos+1; i<NumChoices; ++i) {
  51.                     if ( toupper(ch) == toupper( *MenuPtr[i].Item ) ) {
  52.                         pos = i;
  53.                         goto EndDefault;
  54.                     }
  55.                 }
  56.                 for (i=0; i<pos; ++i) {
  57.                     if ( toupper(ch) == toupper( *MenuPtr[i].Item ) ) {
  58.                         pos = i;
  59.                         break;
  60.                     }
  61.                 }
  62. EndDefault:
  63.                 break;
  64.         }
  65.     }
  66. }
  67.